#include <plugins_manager_appfwk/qls_plugins_manager_tablewidget.h>
#include "ui_qls_plugins_manager_tablewidget.h"

#include <QTableWidgetItem>

QLsPluginsManagerTableWidget::QLsPluginsManagerTableWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::QLsPluginsManagerTableWidget),
      m_isShowPluginsManagerWidget(false)
{
    ui->setupUi(this);

    ui->tableWidget->setColumnCount(3);                     /* 3列 */
    ui->tableWidget->horizontalHeader()->setVisible(false); /* 隐藏行表头 */
    ui->tableWidget->verticalHeader()->setVisible(false); /* 隐藏列表头 */
    /* 样式 */
    ui->tableWidget->setEditTriggers(
        QAbstractItemView::NoEditTriggers); /* 设置不可编辑 */
    ui->tableWidget->setSelectionBehavior(
        QAbstractItemView::SelectItems); /* 单个选中 */
    ui->tableWidget->setSelectionMode(
        QAbstractItemView::NoSelection); /* 不可选中 */
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(
        QHeaderView::Stretch); /* 自动列宽并等宽 */
    //	ui->tableWidget->setAlternatingRowColors(true);
    ///* 交替颜色 */ 	ui->tableWidget->setShowGrid(false);
    ///* 不显示网格 */
    ui->tableWidget->setMouseTracking(true);
}

QLsPluginsManagerTableWidget::~QLsPluginsManagerTableWidget()
{
    /* 清空表格数据 */
    for (PluginInfoPos info : m_pluginInfoPosList) {
        /* 删除表格中的数据 */
        ui->tableWidget->removeCellWidget(info.m_pos.x(), info.m_pos.y());
        delete (ui->tableWidget->item(info.m_pos.x(), info.m_pos.y()));
        ui->tableWidget->setItem(info.m_pos.x(), info.m_pos.y(), nullptr);

        /* 从列表中移除 */
        m_pluginInfoPosList.removeOne(info);
    }

    delete ui;
}

/* 添加插件界面 */
void QLsPluginsManagerTableWidget::AddPluginWidget(const PluginInfo &pluginInfo)
{
    /* 校验 */
    if (IsAlreadyExisted(pluginInfo))
        return;

    /* 创建插件界面并写入数据 */
    QLsPluginWidget *pluginWidget = new QLsPluginWidget;
    connect(pluginWidget, &QLsPluginWidget::sigLoad, this,
            &QLsPluginsManagerTableWidget::slotLoad);

    pluginWidget->setPluginInfo(pluginInfo);

    /* 获取空格位置 */
    QPoint pos = GetSpacePos();

    /* 加入空格数据 */
    QTableWidgetItem *item = new QTableWidgetItem;
    ui->tableWidget->setItem(pos.x(), pos.y(), item);
    ui->tableWidget->setCellWidget(pos.x(), pos.y(), pluginWidget);
    m_pluginInfoPosList.append(PluginInfoPos(pluginInfo, pos));
}

/* 删除插件界面 */
void QLsPluginsManagerTableWidget::DeletePluginWidget(
    const PluginInfo &pluginInfo)
{
    /* 校验 */
    if (!IsAlreadyExisted(pluginInfo))
        return;

    /* 移除 */
    for (PluginInfoPos info : m_pluginInfoPosList) {
        if (info.m_pluginInfo == pluginInfo) {
            /* 删除表格中的数据 */
            ui->tableWidget->removeCellWidget(info.m_pos.x(), info.m_pos.y());
            delete (ui->tableWidget->item(info.m_pos.x(), info.m_pos.y()));
            ui->tableWidget->setItem(info.m_pos.x(), info.m_pos.y(), nullptr);

            /* 从列表中移除 */
            m_pluginInfoPosList.removeOne(info);
            break;
        }
    }
}

/* 转发所有插件的加载信号的槽函数 */
void QLsPluginsManagerTableWidget::slotLoad(PluginInfo &pluginInfo)
{
    emit sigLoad(pluginInfo);
}

/* 加载结果的槽函数 */
void QLsPluginsManagerTableWidget::slotLoadRes(PluginInfo &pluginInfo)
{
    /* 找到该插件 */
    for (PluginInfoPos info : m_pluginInfoPosList) {
        if (info.m_pluginInfo == pluginInfo) {
            QLsPluginWidget *pluginWidget =
                (QLsPluginWidget *)ui->tableWidget->cellWidget(info.m_pos.x(),
                                                               info.m_pos.y());
            pluginWidget->setPluginInfo(pluginInfo);
            return;
        }
    }

    /* 如果找不到，就添加 */
    AddPluginWidget(pluginInfo);
}

/* 获取当前表格靠前的空格(未添加或被删除导致的空格)位置 */
QPoint QLsPluginsManagerTableWidget::GetSpacePos()
{
    QPoint pos;
    int rowCount = ui->tableWidget->rowCount();

    /* 在已有表格中找空格 */
    for (int i = 0; i < rowCount; i++) {
        for (int j = 0; j < 3; j++) {
            if (!ui->tableWidget->item(i, j)) { /* 找到空格 */
                pos.setX(i);
                pos.setY(j);
                return pos;
            }
        }
    }

    /* 如果没找到，则新建行 */
    ui->tableWidget->insertRow(rowCount);
    pos.setX(rowCount);
    pos.setY(0);
    return pos;
}

/* 是否已存在该插件 */
bool QLsPluginsManagerTableWidget::IsAlreadyExisted(
    const PluginInfo &pluginInfo)
{
    for (PluginInfoPos info : m_pluginInfoPosList)
        if (info.m_pluginInfo == pluginInfo)
            return true;
    return false;
}

/* 是否显示插件管理器界面 */
bool QLsPluginsManagerTableWidget::isShowPluginsManagerWidget() const
{
    return m_isShowPluginsManagerWidget;
}

void QLsPluginsManagerTableWidget::setIsShowPluginsManagerWidget(
    bool isShowPluginsManagerWidget)
{
    if (m_isShowPluginsManagerWidget == isShowPluginsManagerWidget)
        return;
    m_isShowPluginsManagerWidget = isShowPluginsManagerWidget;

    /* 显示插件管理器窗口 */
    if (m_isShowPluginsManagerWidget) {
    }
    /* 隐藏插件管理器窗口 */
    else {
    }
}

PluginInfoPos::PluginInfoPos()
{
}

PluginInfoPos::PluginInfoPos(PluginInfo pluginInfo, QPoint pos)
    : m_pluginInfo(pluginInfo), m_pos(pos)
{
}

bool PluginInfoPos::operator==(const PluginInfoPos &other)
{
    return this->m_pluginInfo == other.m_pluginInfo;
}
